import type { InjectionKey } from 'vue'
import { watch } from 'vue'

import { defineStore, useStoreLocal } from '@naturefw/nf-state'
import type { IState } from '@naturefw/nf-state/dist/type'

import type {
  IRoleData
} from '../types/10-role'


const flag = Symbol('role') as InjectionKey<string>

/**
 * 注册局部状态
 * * 角色管理用的状态 : IRoleData & IState <IRoleData>
 * @returns
 */
export const regRoleState = (): IRoleData & IState => {
  // 定义 角色用的状态
  const state = defineStore<IRoleData>(flag, {
    state: (): IRoleData => {
      return {
        modules: [], // 模块信息，绑定 tree
        buttons: {}, // 模块里面的操作按钮，绑定 模块里的按钮
        grids: {}, // 模块里面的列
        finds: {}, // 模块里面的查询条件
        resources: {}, // 模块里面可以选择的资源权限
        APIs: {}, // 模块里面可以选择的（其他）后端API
        haveCols: {}, // 模块是否有列、资源权限等选项
        roleInfo: { // 当前的角色的信息
          roleId: 0,
          roleName: '默认' ,
          rolePower: { // 角色拥有的权限集合
            moduleIds: [], // 权限到【模块】
            buttonIds: {}, // 权限到【按钮】，按钮ID集合
            gridIds: {}, // 权限到【列表】字段，列表里的字段ID集合
            findIds: {}, // 权限到【查询】字段，查询里的字段ID集合
            gridIdsNot: {}, // 【列表】里的字段ID集合，不允许使用的
            findIdsNot: {}, // 【查询】里的字段ID集合，不允许使用的
            resources: {}, // 可以使用的【资源权限】
            APIs: {} // 可以使用的【API】
          }
        }
      }
    },
    getters: {
    },
    actions: {
      /**
       * 加载数据，
       * @param isReset true：设置总数，页号设置为1；false：仅翻页
       */
      async loadData (isReset = false) {
        // 加载数据
      }
    }
  },
  { isLocal: true }
  )
 
  return state
}

/**
 * 子组件获取状态
 */
export const getRoleState = (): IRoleData & IState => {
  return useStoreLocal<IRoleData & IState>(flag)
}
